home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Add-Ons / MPW / MPW re2c 1.1 / dfa.h < prev    next >
Text File  |  1995-09-08  |  3KB  |  155 lines

  1. #ifndef _dfa_h
  2. #define _dfa_h
  3.  
  4. // $Log: dfa.h,v $
  5. //Revision 1.1  1994/04/08  15:27:59  peter
  6. //Initial revision
  7. //
  8.  
  9. #include <iostream.h>
  10. #include "re.h"
  11.  
  12. extern void prtCh(ostream&, uchar);
  13. extern void printSpan(ostream&, uint, uint);
  14.  
  15. class DFA;
  16. class State;
  17.  
  18. class Action {
  19. public:
  20.     State        *state;
  21. public:
  22.     Action(State*);
  23.     virtual void emit(ostream&) = 0;
  24. };
  25.  
  26. class Match: public Action {
  27. public:
  28.     Match(State*);
  29.     void emit(ostream&);
  30. };
  31.  
  32. class Enter: public Action {
  33. public:
  34.     uint        label;
  35. public:
  36.     Enter(State*, uint);
  37.     void emit(ostream&);
  38. };
  39.  
  40. class Save: public Match {
  41. public:
  42.     uint        selector;
  43. public:
  44.     Save(State*, uint);
  45.     void emit(ostream&);
  46. };
  47.  
  48. class Move: public Action {
  49. public:
  50.     Move(State*);
  51.     void emit(ostream&);
  52. };
  53.  
  54. class Accept: public Action {
  55. public:
  56.     uint        nRules;
  57.     uint        *saves;
  58.     State        **rules;
  59. public:
  60.     Accept(State*, uint, uint*, State**);
  61.     void emit(ostream&);
  62. };
  63.  
  64. class Rule: public Action {
  65. public:
  66.     RuleOp        *rule;
  67. public:
  68.     Rule(State*, RuleOp*);
  69.     void emit(ostream&);
  70. };
  71.  
  72. class Span {
  73. public:
  74.     uint        ub;
  75.     State        *to;
  76. public:
  77.     uint show(ostream&, uint);
  78. };
  79.  
  80. class Go {
  81. public:
  82.     uint        nSpans;
  83.     Span        *span;
  84. public:
  85.     void genGoto(ostream&, State*);
  86.     void genBase(ostream&, State*);
  87.     void genLinear(ostream&, State*);
  88.     void genBinary(ostream&, State*);
  89.     void genSwitch(ostream&, State*);
  90.     void compact();
  91.     void unmap(Go*, State*);
  92. };
  93.  
  94. class State {
  95. public:
  96.     uint        label;
  97.     RuleOp        *rule;
  98.     State        *next;
  99.     State        *link;
  100.     uint        depth;        // for finding SCCs
  101.     uint        kCount;
  102.     Ins            **kernel;
  103.     bool        isBase:1;
  104.     Go            go;
  105.     Action        *action;
  106. public:
  107.     State();
  108.     ~State();
  109.     void emit(ostream&);
  110.     friend inline ostream& operator<<(ostream&, const State&);
  111.     friend inline ostream& operator<<(ostream&, const State*);
  112. };
  113.  
  114. class DFA {
  115. public:
  116.     uint        lbChar;
  117.     uint        ubChar;
  118.     uint        nStates;
  119.     State        *head, **tail;
  120.     State        *toDo;
  121. public:
  122.     DFA(Ins*, uint, uint, uint, Char*);
  123.     ~DFA();
  124.     void addState(State**, State*);
  125.     State *findState(Ins**, uint);
  126.     void split(State*);
  127.  
  128.     void findSCCs();
  129.     void emit(ostream&);
  130.  
  131.     friend inline ostream& operator<<(ostream&, const DFA&);
  132.     friend inline ostream& operator<<(ostream&, const DFA*);
  133. };
  134.  
  135. inline Action::Action(State *s) : state(s) {
  136.     s->action = this;
  137. }
  138.  
  139. inline Match::Match(State *s) : Action(s)
  140.     { }
  141.  
  142. inline Enter::Enter(State *s, uint l) : Action(s), label(l)
  143.     { }
  144.  
  145. inline Save::Save(State *s, uint i) : Match(s), selector(i)
  146.     { }
  147.  
  148. inline ostream& operator<<(ostream &o, const State *s)
  149.     { return o << *s; }
  150.  
  151. inline ostream& operator<<(ostream &o, const DFA *dfa)
  152.     { return o << *dfa; }
  153.  
  154. #endif
  155.